package com.wulian.common.util;

import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.BeanUtils;

public class Util {
	public static List<Map<String, Object>> activitiResult(List<?> objs) {
        // 用于存放多个对象的集合
        List<Map<String, Object>> pdResult = new ArrayList<>();
        // 遍历方法参数中的集合
        for (Object obj : objs) {
            // 用于封装单个对象 get 方法返回值的 Map 集合
            Map<String, Object> pdMap = new HashMap<>();
            // 通过反射获取该对象的方法对象数组
            Method[] methods = obj.getClass().getDeclaredMethods();
            // 遍历方法对象数组
            for (Method method : methods) {
                // 获取方法名称
                String methodName = method.getName();
                // 判断该方法是否名称不为 null ，并且名称是以 get 开头，满足条件进入 if 中
                if (methodName != null && methodName.startsWith("get")) {
                    // 设置方法的访问权限
                    method.setAccessible(true);
                    try {
                  		// 将方法名的 get 前缀去掉，并增加 pd 前缀
                        String pdKey = methodName.substring(3);
                        // 将 get 方法的名称作为 Map 的 key，将返回值作为 value 进行封装
                        pdMap.put(pdKey, method.invoke(obj, null));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
            // 将封装好的 Map 集合添加到 List 集合中
            pdResult.add(pdMap);
        }
        return pdResult;
    }
	
	public static List<Map<String, Object>> javaBean2Map(List<?> objs) throws Exception {
		 // 用于存放多个对象的集合
        List<Map<String, Object>> result = new ArrayList<>();
		          Map<String, Object> map = new HashMap<>();
		          // 遍历方法参数中的集合
		          for (Object obj : objs) {
		          Method[] methods = obj.getClass().getMethods(); // 获取所有方法
		          for (Method method : methods) {
		              if (method.getName().startsWith("get")) {
		                  String field = method.getName(); // 拼接属性名
		                  field = field.substring(field.indexOf("get") + 3);
		                  field = field.toLowerCase().charAt(0) + field.substring(1);
		                  Object value = method.invoke(obj, (Object[]) null); // 执行方法
		                 map.put(field, value);
		             }
		         }
		          result.add(map);
		     }
		          
		          return result;
		          
	}
	
	public static List<Map<String, Object>> ListBeanToListMap(List<?> list) throws NoSuchMethodException,
	SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {

List<Map<String, Object>> listmap = new ArrayList<Map<String, Object>>();

for (Object ob : list) {

	listmap.add(beanToMap(ob));
}

return listmap;
}
	
	public static Map beanToMap(Object obj) throws NoSuchMethodException, SecurityException, IllegalAccessException,
	IllegalArgumentException, InvocationTargetException {
// 创建map集合
Map map = new HashMap();
// 获取JavaBean中所有属性
Field[] fields = obj.getClass().getDeclaredFields();

for (Field fie : fields) {

	// 将属性第一个字母转换成大写
	String frist = fie.getName().substring(0, 1).toUpperCase();
	// 获取属性的类型
	Class<?> type = fie.getType();
	// 封装属性的get
	String getter = "";
	if ("boolean".equals(type.getName())) {
		getter = "is" + frist + fie.getName().substring(1);
	} else {
		getter = "get" + frist + fie.getName().substring(1);
	}
	// 获取JavaBean的方法
	Method method = obj.getClass().getMethod(getter, new Class[] {});
	// 调用方法,并接收返回值
	Object objec = method.invoke(obj, new Object[] {});

	// 判断返回值不为空
	if (objec != null) {
		map.put(fie.getName(), objec);
	} else {
		map.put(fie.getName(), "");
	}
}

return map;
}
}
